﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data;
using System.Data.OleDb;

public class leerCSV
{
    controlImportacion ctrl = new controlImportacion();
    MySqlClase bd = new MySqlClase();
    enviarCorreoElectronico.enviarCorreo correo = new enviarCorreoElectronico.enviarCorreo();

    bool ok = false;
    string ruta,cad;
    DataTable dt;
    string sql = "";
    OleDbConnection cnn = new OleDbConnection();
    OleDbCommand cmd;
    OleDbDataAdapter da;
    OleDbDataReader dr;
    private string email = "";

    public leerCSV(string _ruta)
	{
        ruta = _ruta;
        cad= @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + ruta + ";" +
        "Extended Properties='text;HDR=Yes;FMT=Delimited;CharSet=cp1253;'";
	}

    /// <summary>
    /// Metodo que lee el archivo csv de un directorio ya establecido con la ruta del constructor.
    /// </summary>
    /// <param name="file">es el nombre del archivo CSV que se leera como nombre de la tabla</param>
    /// <returns>DataTable</returns>
    public DataTable leerArchivoCSV(string file)
    {
        sql = "select * from " + file + ";";
        try{
            cnn.ConnectionString=cad;
            cnn.Open();
            cmd = new OleDbCommand(sql, cnn);
            dt = new DataTable();
            dt.Load(cmd.ExecuteReader());
            cnn.Close();
        }
        catch (OleDbException ex){
            cnn.Close();
        }
        return dt;
    }

    /// <summary>
    /// lee un archvo csv, busca dulicados en la tabla de csvBanco y si no está duplicado, guarda en la tabla
    /// </summary>
    /// <param name="file"></param>
    /// <returns></returns>
    public string leerUnRegistroCSV(string file)
    {
        //vacia la tabla completa...
        ctrl.eliminarTabla();
        //
        string msj = "";
        sql = "select * from " + file + ";";
        //agrega nuevos datos a la tabla
        try
        {
            cnn.ConnectionString = cad;
            cnn.Open();
            cmd = new OleDbCommand(sql, cnn);
            dr= cmd.ExecuteReader();
            while (dr.Read())   {
                DateTime fecha;
                try
                {
                    object[] datos = new object[7];
                    datos[0] = Convert.ToInt32(dr[0]);
                    datos[1] = this.formatFecha(fecha = Convert.ToDateTime(dr[1]));
                    datos[2] = Convert.ToString(dr[2]);

                    try { datos[3] = "hola"; }// Convert.ToString(dr[3]); }
                    catch { datos[3] = "'na'"; }

                    datos[4] = Convert.ToString(dr[4]);
                    datos[5] = Convert.ToDouble(dr[5]);
                    datos[6] = Convert.ToString(dr[6]);

                    msj = ctrl.guardarCSV(datos);
                    //actualiza el estado del alumno que ya pagó

                    if (this.actualizarEstado(datos[2].ToString())) { //si se hace el cambio de estado, envia un correo de confirmacion :)
                        correo.confirmacionReinscripcion(email);


                    }


                }
                catch { }
            }
            cnn.Close();
        }
        catch (OleDbException ex)
        {
            cnn.Close();
        }
        return msj;
    }

    /// <summary>
    /// da formato a la fecha obtenida en el archivo csv
    /// </summary>
    /// <param name="fecha"></param>
    /// <returns></returns>
    private string formatFecha(DateTime fecha) {
        string _fecha = "";
        string mes = "";
        if (fecha.Month < 10) { mes = "0" + fecha.Month; }

        _fecha = fecha.Year + "-" + mes + "-" + fecha.Day;

        return _fecha;
    }

    /// <summary>
    /// metodo que busca el numero referencial del csv y busca a que alumno le pertenece. al alumno encontrado se le cambia el
    /// estado a inscrito.
    /// </summary>
    /// <param name="nref"></param>
    /// <returns></returns>
    private bool actualizarEstado(string nref) {
        string matricula = "";
        sql = "select a.matricula, email from alumnos a, alumno_ref ar where a.matricula= ar.matricula and ar.numReferencial='" + nref + "';";
        try
        {
            if (bd.AbrirConexion())
            {
                bd.Consultar(sql);
                while (bd.DatosConsulta.Read())
                {
                    try{
                        matricula = bd.DatosConsulta.GetString(0);
                        email = bd.DatosConsulta.GetString(1);
                        ok = true;
                    }
                        
                    catch{}
                }
                if(matricula==""){
                    ok=false; //regreso false como dato que no se encontró.
                }
            }
                bd.CerrarConexion();
        }
        catch{}
        //ACTUALIZACION DE REGISTRO
            string _sqlUp = "update alumnos set estado='inscrito' where matricula = '" + matricula + "';";
            if (ok)//si se encontré al alumno y el numero referencial, entonces acualizo el campo...
            {
                if (bd.AbrirConexion())
                {
                    ok = bd.EjecutarSql(_sqlUp);
                    bd.CerrarConexion();
                }
            }
        return ok;
    }
}